package com.i2863.tools.weixinmp.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * redis 连接池
 *
 * @author xuweiwei
 * @date 2017/5/20
 */
public final class RedisPool {
    private static Logger logger = LoggerFactory.getLogger(RedisPool.class);

    /**
     * 可用连接实例的最大数目，默认为8；
     * 如果赋值为-1，则表示不限制，如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)
     */
    private static Integer MAX_TOTAL = 100;
    /**
     * 控制一个pool最多有多少个状态为idle(空闲)的jedis实例，默认值是8
     */
    private static Integer MAX_IDLE = 8;
    /**
     * 等待可用连接的最大时间，单位是毫秒，默认值为-1，表示永不超时。
     * 如果超过等待时间，则直接抛出JedisConnectionException
     */
    private static Integer MAX_WAIT_MILLIS = 10000;
    /**
     * 超时毫秒数
     */
    private static Integer TIMEOUT = 10000;
    /**
     * 在borrow(用)一个jedis实例时，是否提前进行validate(验证)操作；
     * 如果为true，则得到的jedis实例均是可用的
     */
    private static Boolean TEST_ON_BORROW = true;
    private static JedisPool jedisPool = null;

    /**
     * 静态块，初始化Redis连接池
     */
    static {

        try {
            String addr = "120.92.15.147";
            int port = 26389;
            String password = "I2863.com";
            MAX_TOTAL = 100;
            MAX_IDLE = 8;
            MAX_WAIT_MILLIS = 10000;
            TIMEOUT = 10000;
            TEST_ON_BORROW = true;
            JedisPoolConfig config = new JedisPoolConfig();
        /*
            在高版本的jedis jar包，比如本版本2.9.0，JedisPoolConfig没有setMaxActive和setMaxWait属性了
            这是因为高版本中官方废弃了此方法，用以下两个属性替换。
            maxActive  ==>  maxTotal
            maxWait==>  maxWaitMillis
         */
            config.setMaxTotal(MAX_TOTAL);
            config.setMaxIdle(MAX_IDLE);
            config.setMaxWaitMillis(MAX_WAIT_MILLIS);
            config.setTestOnBorrow(TEST_ON_BORROW);
            if (password != null && password.trim().length() > 0) {
                jedisPool = new JedisPool(config, addr, port, TIMEOUT, password);
            } else {
                jedisPool = new JedisPool(config, addr, port, TIMEOUT);
            }
        } catch (Exception e) {
            logger.error("redis 连接池初始化错误", e);
        }

    }

    /**
     * 获取Jedis实例
     *
     * @return
     */
    public synchronized static Jedis getJedis() {
        return jedisPool.getResource();
    }

    /**
     * 返回资源
     *
     * @param jedis jedis实例
     */
    public static void close(final Jedis jedis) {
        if (jedis != null) {
            try {
                jedis.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
